Hi,今天我們來實作自動暫存之機制,當表單的輸入項目很多時,其實會有暫存的需求,甚至極端狀況下,若是出現瀏覽器當掉重開的狀況,如果有類似像word的機制,重開後可以接續再重打資料的話,用起來會比較安心,今天我們會使用到vue.js 的 watch 和 localStorage,來進行我流版暫存功能
其實作業原理很簡單,
const { createApp, onBeforeMount, reactive } = Vue
let data = reactive({ casedesc: "", caseinfo: "", inErr: false})
createApp({
setup() {
//啟動時,檢查 localStorage 有無 tmpdata
let tmpstr = localStorage.getItem("tmpdata")
if(tmpstr) {
//因 tmpdata 只能存文字資料,故進行文字轉 json,轉換完畢後,指派給 data 的各項屬性
let tmpdata = JSON.parse(tmpstr)
//不可以直接將 tmpdata 指派給 data
data.caseinfo = tmpdata.caseinfo
data.casedesc = tmpdata.casedesc
}
return { data }
},
watch: {
data: {
//監看深層屬性
deep: true,
handler: function(oldval, newval) {
let tmpdata = {
casedesc: newval.casedesc,
caseinfo: newval.caseinfo
}
//localStorage 只可以放文字,所以物件要轉成文字存入
localStorage.setItem("tmpdata", JSON.stringify(tmpdata))
}
}
},
methods: {
readfile(e) {
let file = e.target.files[0]
let reader = new FileReader()
if(file) {
reader.onload = function(e) {
data.fileinfo = reader.result;
}
reader.readAsDataURL(file)
}
},
senddata() {
if(data.casedesc === "" || data.caseinfo === "") {
alert("請務必輸入問題描述與說明")
data.inErr = true
return false
}
axios.post("/saf/mgr/api/saveCase", {
casedesc: data.casedesc,
caseinfo: data.caseinfo,
fileinfo: data.fileinfo
}).then(function (response) {
let rt = response.data
if (rt.status == "00") {
//存檔成功能,刪除暫存資料
localStorage.delItem("tmpdata")
alert("存檔成功")
}
}).catch(function (response) {
alert(response.response.data)
})
}
}
})
.mount('#app')
說明:
執行原理如同上方之說明,但是有幾點需要注意
watch: {
"data.casedesc": function(oldval, newval) {
//....
}